Database engines typically provide search functionality that allow a subset of data to be returned based on user defined search criteria. For unordered data without indexing, search operations often require all records in the database to be analyzed against the search criteria before the complete result set can be returned. Database sizes can be substantial. Analyzing all records in a database against specified search criteria can take hours or even days to complete. The time required to complete a search can be reduced by using indexes, but indexes increase the storage space required for the database and the time required to add or modify database entries. If the most common search operations are known in advance, a database can be designed to only index data required to optimize common search operations. However, for databases where common search operations are not known in advance or may change over time, a need exists to dynamically adapt the set of indexes during operation to optimize database performance and storage requirements.